또 다른 유용한 훅

Anthropic
Claude에서 열기
이 강좌에 대해 질문하기
노트 복사
LLM용 전체 강좌 노트 복사

이 강좌에서 다룬 PreToolUsePostToolUse 훅 외에도 더 많은 훅이 있습니다. 다음과 같은 훅들도 있습니다:

  • Notification - Claude Code가 알림을 보낼 때 실행됩니다. Claude가 도구 사용 권한이 필요하거나, Claude Code가 60초 동안 유휴 상태일 때 발생합니다
  • Stop - Claude Code가 응답을 완료했을 때 실행됩니다
  • SubagentStop - 서브에이전트(UI에서 "Task"로 표시됨)가 완료되었을 때 실행됩니다
  • PreCompact - 수동 또는 자동으로 컴팩트 작업이 수행되기 전에 실행됩니다
  • UserPromptSubmit - 사용자가 프롬프트를 제출할 때, Claude가 처리하기 전에 실행됩니다
  • SessionStart - 세션을 시작하거나 재개할 때 실행됩니다
  • SessionEnd - 세션이 종료될 때 실행됩니다

여기서 헷갈리는 부분이 있습니다:

  1. 명령어의 stdin 입력은 실행되는 훅 유형( PreToolUse , PostToolUse , Notification 등)에 따라 달라집니다
  2. 그 안에 포함된 tool_input은 호출된 도구에 따라 다릅니다( PreToolUsePostToolUse 훅의 경우)

예를 들어, 다음은 훅에 대한 stdin 입력 샘플입니다. 이 훅은 TodoWrite 도구 사용을 감시하는 PostToolUse 훅입니다. 참고로, TodoWrite는 Claude가 할 일 항목을 추적하는 데 사용하는 도구입니다.

{
  "session_id": "9ecf22fa-edf8-4332-ae85-b6d5456eda64",
  "transcript_path": "<path_to_transcript>",
  "hook_event_name": "PostToolUse",
  "tool_name": "TodoWrite",
  "tool_input": {
    "todos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
  },
  "tool_response": {
    "oldTodos": [],
    "newTodos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
  }
}

비교를 위해, 다음은 Stop 훅에 대한 입력 예시입니다:

{
  "session_id": "af9f50b6-f042-4773-b3e2-c3a4814765ce",
  "transcript_path": "<path_to_transcript>",
  "hook_event_name": "Stop",
  "stop_hook_active": false
}

보시다시피, 명령어의 stdin 입력은 훅 유형( PreToolUse , PostToolUse , Stop 등) 사용된 매처( PreToolUsePostToolUse 의 경우)에 따라 크게 달라집니다. 이로 인해 훅 작성이 어려울 수 있습니다 - 명령어에 입력될 데이터의 정확한 구조를 알지 못할 수도 있습니다!

이 문제를 해결하려면 다음과 같은 헬퍼 훅을 만들어 보세요:

"PostToolUse": [ // Or "PreToolUse" or "Stop", etc
  {
    "matcher": "*",
    "hooks": [
      {
        "type": "command",
        "command": "jq . > post-log.json"
      }
    ]
  },
]

제공된 명령어를 주목하세요. 이 훅에 대한 입력을 post-log.json 파일에 기록하여, 명령어에 실제로 무엇이 전달되는지 정확히 확인할 수 있습니다! 이를 통해 명령어가 어떤 데이터를 처리해야 하는지 훨씬 쉽게 이해할 수 있습니다.